using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using RBDD.Embol.AccesoDatos.Entidades;
using RBDD.Embol.AccesoDatos.Contratos;
using RBDD.Embol.Negocios.Servicios;
using RBDD.Embol.Negocios.Excepciones;

namespace RBDD.Embol.Negocios
{
   /// <summary>
   /// Implementacion de la interface IUsuarioNegociosServicio, los metodos que estan definidos en el contrato IUsuarioNegociosServicio serán accesibles desde un contexto externo
   /// </summary>	
   public class UsuarioNegocios : IUsuarioNegociosServicio
   {
	private IUsuarioAccesoDatos accesoDatos;
	public UsuarioNegocios()
	{		
		accesoDatos = DataFactory.Current.GetUsuarioAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de Usuario's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<Usuario> BuscarPorFiltro(string filtro)
	{
		return accesoDatos.BuscarPorFiltro(filtro).ToList();
	}

	#region operaciones básicas
	
	/// <summary>
    /// Elimina la entidad Usuario, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(Usuario entidad)
	{
		try
		{
		    accesoDatos.Delete(accesoDatos.GetById(entidad.Id));
	    }
		catch(Exception ex)
		{
		   throw new UsuarioEliminarExcepcion("Usuario");
		}
	}
	
	/// <summary>
    /// Devuelve Usuario, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public Usuario ObtenerPorId(object Id)
	{
		return accesoDatos.GetById(Id);
	}

	/// <summary>
    /// Devuelve List<Usuario>, de todas la entidades de ese tipo
    /// </summary>	
	public List<Usuario> ObtenerTodas()
	{
		return accesoDatos.GetAll().ToList();
	}

	
	/// <summary>
    /// Guarda Usuario, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public Usuario Guardar(Usuario entidad)
	{
		//Agregar aqui las reglas de negocio.......	
		if(entidad==null)
		 throw new UsuarioRequeridoExcepcion(); 
		
		#region Foreign Keys Values
                if(entidad.HistorialSessionId_FK > 0 && entidad.HistorialSession==null)
                    entidad.HistorialSession = DataFactory.Current.GetHistorialSessionAccesoDatos().GetById(entidad.HistorialSessionId_FK);
                if(entidad.PersonaId_FK > 0 && entidad.Persona==null)
                    entidad.Persona = DataFactory.Current.GetPersonaAccesoDatos().GetById(entidad.PersonaId_FK);
                if(entidad.RolId_FK > 0 && entidad.Rol==null)
                    entidad.Rol = DataFactory.Current.GetRolAccesoDatos().GetById(entidad.RolId_FK);
                #endregion

			
		if (entidad.Id == 0)
			accesoDatos.Insert(entidad);
		else
			accesoDatos.Update(entidad);

		return entidad;
	}

	#endregion

       public Usuario BuscarUsuario(object usuario, string contrasena)
       {
           //return new Usuario()
           //{
           //    Nombre = "Creado Manualmente en UsuarioNegocios.cs",
           //    Rol = new Rol() { Nombre = "Admin" }
           //};

           //descomentar este metodo para que consulte desde la base de datos
           return ObtenerTodas().FirstOrDefault(p => p.Nombre.Equals(usuario) && p.Contrasena.Equals(contrasena));
       }
   }
}


